//
//  Problem816.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/30.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 816. 模糊坐标 【字符转数字】
 我们有一些二维坐标，如 "(1, 3)" 或 "(2, 0.5)"，然后我们移除所有逗号，小数点和空格，得到一个字符串S。返回所有可能的原始字符串到一个列表中。

 原始的坐标表示法不会存在多余的零，所以不会出现类似于"00", "0.0", "0.00", "1.0", "001", "00.01"或一些其他更小的数来表示坐标。此外，一个小数点前至少存在一个数，所以也不会出现“.1”形式的数字。

 最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间（逗号之后）都有一个空格。

 示例 1:
     输入: "(123)"
     输出: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]
 示例 2:
     输入: "(00011)"
     输出:  ["(0.001, 1)", "(0, 0.011)"]
     解释:
     0.0, 00, 0001 或 00.01 是不被允许的。
 示例 3:
     输入: "(0123)"
     输出: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]
 示例 4:
     输入: "(100)"
     输出: [(10, 0)]
     解释:
     1.0 是不被允许的。
 提示:
     4 <= S.length <= 12.
     S[0] = "(", S[S.length - 1] = ")", 且字符串 S 中的其他元素都是数字。
 */
@objcMembers class Problem816: NSObject {
    
    func solution() {
        print(ambiguousCoordinates("(123)"))
        print(ambiguousCoordinates("(00011)"))
        print(ambiguousCoordinates("(0123)"))
        print(ambiguousCoordinates("(100)"))
    }
    
    /*
     1: 首先确认',' 放置的位置
     2：将',' 插入到每个数字中间，获取左右2边的数字字符串，然后 相乘
     3：将'.',插入每个数字的中间，看看是否符合条件，
     */
    func ambiguousCoordinates(_ S: String) -> [String] {
        var list:[String] = []
        let charts = Array(S)
        for i in 1..<charts.count-2 {
            // left = [1, i]
            let left = isNumber(charts, 1, i)
            // right = [i+1, end]
            let right = isNumber(charts, i+1, charts.count-2)
        
            if left.count == 0 || right.count == 0 {
                continue
            }
//            print(left)
//            print(right)
            for leftStr in left {
                for rightStr in right {
                    list.append("(" + leftStr + ", " + rightStr + ")")
                }
            }
            
        }
        return list
    }
    
    /*
     以下情况：
     0: 只有一个数 0、1、2，本身满足条件 = 1
     1: 开始是0，结尾不是0，例如：0123、0012、0001，小数点只能放到0后，才能满足 = 1
     2: 开始不是0，结尾是0，例如：1230、1200、1000，只有本身满足，不能放小数点  = 1
     3: 开始和结尾都不是0：1234 123 1203 1003 = len
     4: 都是0， 00 000，不满足
     */
    func isNumber(_ charts:[Character], _ left: Int, _ right: Int) -> [String] {
        if left == right {
            return [String(charts[left])]
        }
        
        let isLeft0 = charts[left] == "0"
        let isRight0 = charts[right] == "0"
        if isLeft0 == true, isRight0 == true {
            return []
        } else if isLeft0 == true {
            var str = "0."
            var i = left + 1
            while i <= right {
                str.append(charts[i])
                i += 1
            }
            return [str]
        } else if isRight0 == true {
            var str = ""
            var i = left
            while i <= right {
                str.append(charts[i])
                i += 1
            }
            return [str]
        } else  {
            var str = ""
            var i = left
            while i <= right {
                str.append(charts[i])
                i += 1
            }
            
            var list:[String] = [str]
            i = 1
            while i < str.count {   // 12
                var tstr = str
                tstr.insert(".", at: tstr.index(tstr.startIndex, offsetBy: i))
                list.append(tstr)
                i += 1
            }
            return list
        }
    }
}
